package com.clq.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.clq.service.TestService;
import com.clq.test.Cat;

/**
 * 动态代理控制器
 * @author chenluqiang
 * @param <FatherInter>
 * @date 2019年3月26日 下午3:57:40 
 *
 */
public class DynaProxyHello implements InvocationHandler{
	//目标对象
	private Object target;
	//调用对象
	private Object proxy;
	
	public Object bind(Object proxy,Object target) {
		this.proxy =  proxy;
		this.target = target;
		//创建实例
		return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(),this);
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object result = null;
		
		//反射得到操作者的实例
		Class clazz = this.proxy.getClass();
		//反射得到操作者的start的方法
		Method[] methods = clazz.getDeclaredMethods();
		for(Method m : methods) {
			Method start = clazz.getDeclaredMethod(m.getName(), null);
			//暴力破解
			start.setAccessible(true);
			start.invoke(this.proxy,null);
		}
		//执行原本调用的方法
		method.invoke(this.target, null);
		return result;
	}
}
